const { app, BrowserWindow, ipcMain, Menu, Tray, nativeImage, dialog } = require('electron');
const path = require('path');
const fs = require('fs');

let mainWindow;
let floatingWindow;
let tray;

// 悬浮窗配置
const floatingConfig = {
  width: 400,
  height: 300,
  x: 100,
  y: 100,
  transparent: true,
  frame: false,
  alwaysOnTop: true,
  skipTaskbar: true,
  resizable: false,
  webPreferences: {
    preload: path.join(__dirname, 'renderer/preload.js'),
    nodeIntegration: false,
    contextIsolation: true
  }
};

function createMainWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    show: process.argv.includes('--dev'), // 开发模式下显示主窗口
    webPreferences: {
      preload: path.join(__dirname, 'renderer/preload.js'),
      nodeIntegration: false,
      contextIsolation: true
    }
  });

  mainWindow.loadFile('renderer/main.html');
  
  // 开发模式下打开开发者工具
  if (process.argv.includes('--dev')) {
    mainWindow.webContents.openDevTools();
  }
}

function createFloatingWindow() {
  floatingWindow = new BrowserWindow(floatingConfig);
  
  floatingWindow.loadFile('renderer/floating.html');
  
  // 设置窗口位置
  floatingWindow.setPosition(floatingConfig.x, floatingConfig.y);
  
  // 开发模式下打开开发者工具
  if (process.argv.includes('--dev')) {
    floatingWindow.webContents.openDevTools();
  }
  
  // 窗口关闭时隐藏而不是销毁
  floatingWindow.on('close', (event) => {
    if (!app.isQuitting) {
      event.preventDefault();
      floatingWindow.hide();
    }
  });
}

function createTray() {
  // 创建托盘图标
  const icon = nativeImage.createFromPath(path.join(__dirname, 'assets', 'icon.png'));
  tray = new Tray(icon);
  
  const contextMenu = Menu.buildFromTemplate([
    {
      label: '显示/隐藏悬浮窗',
      click: () => {
        if (floatingWindow) {
          if (floatingWindow.isVisible()) {
            floatingWindow.hide();
          } else {
            floatingWindow.show();
          }
        }
      }
    },
    {
      label: '设置',
      click: () => {
        if (mainWindow) {
          mainWindow.show();
        }
      }
    },
    { type: 'separator' },
    {
      label: '退出',
      click: () => {
        app.quit();
      }
    }
  ]);
  
  tray.setContextMenu(contextMenu);
  tray.setToolTip('桌面小说阅读器');
}

// IPC 通信处理
ipcMain.handle('get-floating-config', () => {
  return floatingConfig;
});

ipcMain.handle('update-floating-config', (event, config) => {
  Object.assign(floatingConfig, config);
  if (floatingWindow) {
    floatingWindow.setSize(config.width, config.height);
    floatingWindow.setPosition(config.x, config.y);
  }
});

// 存储当前小说内容
let currentNovel = {
  title: "示例小说",
  content: `这是一个示例小说内容。

第一章 开始

这是一个美好的早晨，阳光透过窗户洒在桌面上。主人公开始了新的一天，他不知道自己即将经历什么。

窗外传来鸟儿的歌声，微风轻抚着树叶，发出沙沙的响声。这是一个适合阅读的下午，也是一个适合摸鱼的下午。

主人公坐在电脑前，假装在工作，实际上正在享受着这个美好的时光。他知道，这样的时光总是短暂的，但他依然珍惜每一刻。

时间在不知不觉中流逝，太阳渐渐西斜，天空被染成了金黄色。主人公合上了书本，准备结束今天的阅读时光。

明天，他将继续这个故事，继续在这个美好的世界中遨游。`
};

ipcMain.handle('get-novel-content', async () => {
  return currentNovel;
});

ipcMain.handle('update-novel-content', async (event, novelData) => {
  currentNovel = novelData;
  // 通知悬浮窗更新内容
  if (floatingWindow) {
    floatingWindow.webContents.send('novel-content-updated', novelData);
  }
  return true;
});

// 处理TXT文件导入
ipcMain.handle('import-txt-file', async (event) => {
  try {
    const result = await dialog.showOpenDialog(mainWindow, {
      properties: ['openFile'],
      filters: [
        { name: 'Text Files', extensions: ['txt'] },
        { name: 'All Files', extensions: ['*'] }
      ]
    });

    if (!result.canceled && result.filePaths.length > 0) {
      const filePath = result.filePaths[0];
      
      // 检查文件大小
      const stats = fs.statSync(filePath);
      const fileSizeInMB = stats.size / (1024 * 1024);
      
      if (fileSizeInMB > 100) {
        return { success: false, message: '文件过大，请选择小于100MB的文件' };
      }
      
      // 尝试使用UTF-8读取文件，如果失败则返回错误
      let content;
      try {
        content = fs.readFileSync(filePath, 'utf8');
      } catch (error) {
        return { success: false, message: '无法读取文件，请确保文件为UTF-8编码' };
      }
      
      const fileName = path.basename(filePath, '.txt');
      
      // 清理内容（移除多余的空行和空格）
      const cleanedContent = content
        .replace(/\r\n/g, '\n')
        .replace(/\n{3,}/g, '\n\n')
        .trim();
      
      return {
        success: true,
        title: fileName,
        content: cleanedContent,
        fileSize: stats.size,
        encoding: encoding
      };
    } else {
      return { success: false, message: '未选择文件' };
    }
  } catch (error) {
    console.error('读取文件失败:', error);
    return { success: false, message: '读取文件失败: ' + error.message };
  }
});

// 处理《剑来》文件导入
ipcMain.handle('import-jianlai-file', async (event) => {
  try {
    // 尝试多个可能的文件路径
    let filePath;
    const possiblePaths = [
      path.join(__dirname, '《剑来》作者：烽火戏诸侯.txt'),
      path.join(process.resourcesPath, '《剑来》作者：烽火戏诸侯.txt'),
      path.join(__dirname, '..', '《剑来》作者：烽火戏诸侯.txt')
    ];
    
    for (const testPath of possiblePaths) {
      if (fs.existsSync(testPath)) {
        filePath = testPath;
        break;
      }
    }
    
    // 检查文件是否存在
    if (!filePath) {
      return { success: false, message: '《剑来》文件不存在，请确保文件在程序目录中' };
    }
    
    // 检查文件大小
    const stats = fs.statSync(filePath);
    const fileSizeInMB = stats.size / (1024 * 1024);
    
    console.log(`《剑来》文件大小: ${fileSizeInMB.toFixed(2)} MB`);
    
    // 尝试检测编码并读取文件
    let content;
    let encoding = 'utf8';
    
    try {
      // 首先尝试UTF-8
      content = fs.readFileSync(filePath, 'utf8');
      // 检查是否有乱码
      if (content.includes('') || content.includes('锟')) {
        throw new Error('UTF-8编码检测到乱码');
      }
    } catch (utf8Error) {
      try {
        // 尝试GBK编码
        if (iconv) {
          const buffer = fs.readFileSync(filePath);
          content = iconv.decode(buffer, 'gbk');
          encoding = 'gbk';
          console.log('使用GBK编码成功读取文件');
        } else {
          // 如果没有iconv-lite，尝试其他编码
          content = fs.readFileSync(filePath, 'latin1');
          encoding = 'latin1';
        }
      } catch (gbkError) {
        return { success: false, message: '无法识别《剑来》文件编码，请确保文件为UTF-8或GBK编码' };
      }
    }
    
    // 清理内容（移除多余的空行和空格）
    const cleanedContent = content
      .replace(/\r\n/g, '\n')
      .replace(/\n{3,}/g, '\n\n')
      .trim();
    
    // 统计章节数量
    const chapterPatterns = [
      /^第[一二三四五六七八九十百千万\d]+章\s*[^\n]*/gm,
      /^第[一二三四五六七八九十百千万\d]+节\s*[^\n]*/gm
    ];
    
    let chapterCount = 0;
    for (const pattern of chapterPatterns) {
      const matches = cleanedContent.match(pattern);
      if (matches) {
        chapterCount += matches.length;
      }
    }
    
    return {
      success: true,
      title: '《剑来》作者：烽火戏诸侯',
      content: cleanedContent,
      fileSize: stats.size,
      encoding: encoding,
      chapterCount: chapterCount
    };
  } catch (error) {
    console.error('读取《剑来》文件失败:', error);
    return { success: false, message: '读取《剑来》文件失败: ' + error.message };
  }
});

app.whenReady().then(() => {
  createMainWindow();
  createFloatingWindow();
  createTray();
  
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createMainWindow();
    }
  });
});

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

// 防止应用退出时关闭悬浮窗
app.on('before-quit', () => {
  if (floatingWindow) {
    floatingWindow.removeAllListeners('close');
    floatingWindow.close();
  }
});